데이터베이스 관계
1. 개요
1. 개요
데이터베이스에서 관계(relation)는 관계 모델의 핵심적인 데이터 구조를 가리킨다. 이는 동일한 구조로 이루어진 튜플(tuple)의 집합으로 정의된다. 관계는 일반적으로 테이블(table)이라는 형태로 시각화되며, 테이블의 각 행(row)은 하나의 튜플에, 각 열(column)은 하나의 속성(attribute)에 대응된다.
하나의 관계는 값으로서의 관계값(relation value)과, 그 값을 저장하는 변수인 관계변수(relvar)로 구분된다. 관계의 구조, 즉 속성명과 각 속성이 취할 수 있는 값의 집합인 정의영역(domain)을 정의한 것을 관계 스키마(relation schema) 또는 테이블 스키마(table schema)라고 부른다. SQL과 같은 데이터베이스 언어에서는 이 관계변수를 주로 '테이블'이라는 용어로 지칭한다.
관계는 제목(heading)과 본체(body)로 구성된다. 제목은 속성들의 집합이며, 본체는 실제 튜플들의 집합이다. 관계의 주요 구조적 특성으로는 제목을 구성하는 속성의 수를 나타내는 차수(degree)와, 본체를 구성하는 튜플의 수를 나타내는 농도(cardinality)가 있다. 또한, 관계 내에서 각 튜플을 유일하게 식별할 수 있는 속성 또는 속성 집합을 후보 키(candidate key)라고 한다.
2. 관계 모델의 기본 개념
2. 관계 모델의 기본 개념
2.1. 관계, 관계값, 관계변수
2.1. 관계, 관계값, 관계변수
관계 모델에서 관계(relation)는 동일한 구조로 이루어진 튜플(tuple)의 집합을 말한다. 이는 일반적으로 테이블(table)이라는 형태로 시각화되며, 테이블의 각 행(row)은 하나의 튜플에, 각 열(column)은 하나의 속성(attribute)에 대응한다.
관계는 크게 두 가지 관점에서 이해된다. 하나는 특정 시점에 존재하는 실제 데이터의 집합인 관계값(relation value)이다. 이는 테이블의 제목(heading)과 본체(body)로 구성되며, 본체는 중복되지 않는 튜플들의 집합이다. 다른 하나는 이러한 관계값을 저장하고 그 값이 시간에 따라 변할 수 있는 관계변수(relvar, relation variable)이다. 데이터베이스에서 사용자가 정의하고 데이터를 삽입하거나 갱신하는 대상은 바로 이 관계변수이다.
일반적인 담화에서는 문맥에 따라 관계변수를 단순히 '관계'라고 부르거나, 관계값을 '관계'라고 부르기도 한다. SQL에서는 관계변수와 거의 동일한 의미로 '테이블'이라는 용어를 사용한다. 관계변수는 데이터 정의 언어(DDL)를 통해 그 구조를 정의하는데, 이때 정의되는 속성명과 정의영역(domain)의 집합을 관계 스키마(relation schema) 또는 테이블 스키마라고 한다.
2.2. 속성, 튜플, 도메인
2.2. 속성, 튜플, 도메인
관계 모델에서 관계는 동일한 구조를 가진 튜플의 집합으로 정의된다. 이는 SQL에서 테이블이라는 개념으로 표현된다. 하나의 관계는 제목(heading)과 본체(body)로 구성되며, 제목은 속성들의 집합이고 본체는 실제 데이터인 튜플들의 집합이다.
관계의 구조를 이루는 기본 구성 요소는 속성, 튜플, 도메인이다. 속성은 테이블의 열(column)에 해당하며, 각 속성은 이름과 그 값이 취할 수 있는 허용 범위인 도메인을 가진다. 예를 들어, '나이'라는 속성은 '0 이상의 정수'라는 도메인을 가질 수 있다. 튜플은 테이블의 행(row)에 해당하며, 여러 속성 값으로 구성된 정렬되지 않은 집합이다. 하나의 튜플은 관계가 나타내는 하나의 엔터티나 사실에 대한 정보를 담는다.
도메인은 각 속성이 가질 수 있는 값의 집합 또는 데이터 타입을 정의한다. 이는 데이터의 무결성을 보장하는 중요한 개념으로, 특정 속성의 모든 값은 반드시 해당 도메인에 속해야 한다. 예를 들어, '성별' 속성의 도메인을 {'남', '여'}로 정의하면, 이 속성의 값은 이 두 가지 중 하나여야 한다. 이러한 속성, 튜플, 도메인의 정의는 관계 스키마 또는 테이블 스키마에 명시된다.
이 세 요소는 관계의 핵심 특성인 차수와 농도를 결정한다. 차수는 속성의 개수, 즉 열의 수이며, 농도는 튜플의 개수, 즉 행의 수를 의미한다. 또한, 튜플을 유일하게 식별할 수 있는 속성 또는 속성 집합인 후보 키도 이러한 기본 구성 요소를 바탕으로 정의된다.
2.3. 관계 스키마
2.3. 관계 스키마
관계 스키마는 관계 모델에서 동일한 구조를 가진 튜플의 집합인 관계값의 구조를 정의하는 청사진이다. 이는 테이블 스키마라고도 불리며, 관계변수가 어떤 형태의 데이터를 담을 수 있는지를 기술한다. 관계 스키마는 주로 제목과 본체로 구성되며, 제목은 속성의 집합, 본체는 실제 튜플의 집합을 가리킨다.
관계 스키마는 속성의 이름과 각 속성이 가져야 하는 값의 집합인 정의영역을 명시한다. 예를 들어, '직원'이라는 관계 스키마는 '사번'(정수형 정의영역), '이름'(문자열 정의영역), '부서'(문자열 정의영역)와 같은 속성들로 구성될 수 있다. 이렇게 정의된 스키마는 데이터베이스에 저장될 데이터의 논리적 구조와 제약 조건을 설정하는 역할을 한다.
SQL과 같은 데이터베이스 언어를 사용할 때, 관계 스키마는 CREATE TABLE 문을 통해 구체화된다. 이 명령어는 테이블의 이름, 각 열의 이름과 데이터 형식, 그리고 기본 키나 외래 키와 같은 제약 조건을 정의하는 데 사용된다. 따라서 관계 스키마는 데이터 정의 언어의 핵심 대상이 된다.
관계 스키마는 데이터베이스 설계 단계에서 매우 중요하며, 이후 정규화 과정을 통해 중복을 줄이고 데이터 무결성을 높이는 기초가 된다. 하나의 데이터베이스 스키마는 여러 개의 관계 스키마로 이루어지며, 이들 간의 관계는 외래 키를 통해 정의된다.
3. 관계의 구조적 특성
3. 관계의 구조적 특성
3.1. 차수
3.1. 차수
관계 모델에서 차수(degree)는 하나의 관계값(relation value)을 구성하는 속성(attribute)의 총 개수를 가리킨다. 이는 테이블의 관점에서 보면 열(column)의 수에 해당한다. 차수는 관계 스키마(relation schema)를 정의하는 핵심적인 구조적 특성 중 하나로, 관계가 얼마나 많은 정보 항목을 담고 있는지를 나타내는 척도이다.
차수는 0 또는 양의 정수 값을 가지며, 차수가 n인 관계를 n항 관계(n-ary relation)라고 부른다. 예를 들어, 직원 정보를 담은 관계가 '사번', '이름', '부서', '입사일'이라는 네 개의 속성으로 구성되어 있다면, 이 관계의 차수는 4이며, 따라서 4항 관계라고 할 수 있다. 차수는 관계변수(relvar)가 정의될 때 데이터 정의 언어(DDL)를 통해 고정되며, 시간이 지나도 변하지 않는 정적인 특성이다.
차수(예시) | 관계의 설명 | 해당 테이블의 열 수 |
|---|---|---|
1항(Unary) | 하나의 속성만을 가진 관계 | 1개 |
2항(Binary) | 두 개의 속성을 가진 관계 | 2개 |
3항(Ternary) | 세 개의 속성을 가진 관계 | 3개 |
n항(n-ary) | n개의 속성을 가진 관계 | n개 |
차수는 관계의 복잡성과 직접적인 연관이 있다. 일반적으로 차수가 높을수록 관계는 더 많은 세부 사항을 표현할 수 있지만, 데이터 중복이나 정규화(normalization) 문제가 발생할 가능성도 함께 고려해야 한다. 데이터베이스 설계 단계에서 적절한 차수를 결정하는 것은 효율적인 데이터 모델링을 위한 중요한 과제이다.
3.2. 농도
3.2. 농도
농도는 관계 모델에서 하나의 관계값을 구성하는 튜플의 수를 의미한다. 즉, 테이블에서 행의 개수에 해당하는 개념이다. 농도는 0 또는 양의 정수 값을 가지며, 시간에 따라 변할 수 있다. 예를 들어, 특정 관계변수에 새로운 튜플이 삽입되거나 기존 튜플이 삭제되면 그 관계값의 농도는 변경된다.
관계 모델의 기본 원칙 중 하나는 하나의 관계값 내에 중복된 튜플이 존재하지 않는다는 것이다. 이는 집합의 수학적 정의에서 중복 원소를 허용하지 않는 것과 동일하다. 따라서 농도는 동일한 값을 가진 튜플을 중복하여 세지 않으며, 고유한 튜플의 개수만을 의미한다. 이 특성은 데이터 무결성을 유지하고 데이터 저장 공간을 효율적으로 사용하는 데 기여한다.
농도는 관계 스키마와 구별되는 개념이다. 관계 스키마는 관계의 구조, 즉 속성의 이름과 도메인을 정의하는 반면, 농도는 특정 시점에 관계에 실제로 존재하는 데이터의 양을 나타낸다. 예를 들어, '고객' 테이블의 스키마가 (고객ID, 이름, 주소)로 정의되어 있다면, 이 테이블에 현재 100명의 고객 정보가 저장되어 있다면 그 관계값의 농도는 100이다.
이 개념은 관계대수 연산의 결과를 설명할 때도 중요하게 사용된다. 예를 들어, 선택 연산이나 조인 연산을 수행하면 원본 관계와는 다른 농도를 가진 새로운 관계값이 생성된다. 데이터베이스 설계 및 질의 최적화 과정에서 예상되는 결과 관계의 농도를 추정하는 것은 시스템 성능을 평가하는 데 유용한 지표가 된다.
3.3. 후보 키
3.3. 후보 키
후보 키는 관계 모델에서 관계값을 구성하는 각각의 튜플을 유일하게 식별할 수 있는 하나 이상의 속성의 집합이다. 하나의 관계에는 하나 이상의 후보 키가 존재할 수 있으며, 이들 모두는 관계 내 모든 튜플에 대해 유일성과 최소성을 만족해야 한다. 유일성은 해당 속성 집합의 값이 모든 튜플에서 중복되지 않음을 의미하고, 최소성은 유일성을 보장하는 데 필요한 속성만을 포함하며 불필요한 속성이 포함되지 않음을 의미한다.
후보 키 중 하나는 기본 키로 선택되어 관계변수의 주요 식별자 역할을 한다. 나머지 후보 키들은 대체 키라고 불린다. 예를 들어, '학생' 관계에서 '학번' 속성과 '주민등록번호' 속성이 모두 튜플을 유일하게 식별할 수 있다면, 둘 다 후보 키가 된다. 이 중 하나인 '학번'이 기본 키로 선택될 수 있다.
후보 키의 개념은 데이터 무결성, 특히 개체 무결성을 보장하는 데 핵심적이다. 또한 관계 데이터베이스에서 인덱스 생성과 테이블 조인의 효율성을 높이는 기반이 된다. SQL에서 PRIMARY KEY 또는 UNIQUE NOT NULL 제약 조건을 통해 후보 키를 정의할 수 있다.
4. 관계와 SQL의 테이블
4. 관계와 SQL의 테이블
관계 모델의 핵심 개념인 관계는 현대 데이터베이스 언어인 SQL에서 테이블이라는 용어로 구현된다. SQL에서 테이블은 관계변수와 거의 동일한 의미로 사용되며, 데이터를 저장하는 기본적인 구조를 가리킨다. 이 테이블은 관계 스키마에 의해 정의된 구조를 가지며, 시간에 따라 변할 수 있는 관계값을 담는 변수의 역할을 한다.
SQL 테이블의 구조는 관계 모델의 구성 요소와 직접적으로 대응된다. 테이블의 각 열(column)은 속성에 해당하며, 각 행(row)은 튜플을 의미한다. 테이블을 정의하는 CREATE TABLE 문은 기본 관계변수를 생성하는 데이터 정의 언어 구문이다. 반면, CREATE VIEW 문을 통해 생성되는 뷰는 하나 이상의 기본 테이블로부터 파생된, 파생 관계변수에 해당한다.
관계 모델의 이론과 SQL의 실제 구현 사이에는 중요한 차이점이 존재한다. 이론상 관계의 튜플은 순서가 없지만, SQL 데이터베이스 관리 시스템에서는 물리적 저장 방식이나 인덱스의 영향으로 행에 특정 순서가 나타날 수 있다. 또한 관계 모델에서 관계값은 중복 튜플을 허용하지 않는 반면, SQL 테이블은 기본적으로 중복 행을 허용한다. 다만, 기본 키나 UNIQUE 제약 조건을 정의함으로써 이러한 중복을 방지할 수 있다.
5. 관계의 예시
5. 관계의 예시
관계 모델에서 관계의 개념을 이해하는 데 도움이 되는 구체적인 예시를 살펴본다. 가장 일반적인 예는 특정 속성 집합을 가진 테이블이다. 예를 들어, '사원'이라는 관계는 사원번호, 이름, 부서, 입사일 등의 속성으로 구성될 수 있다. 이때 각 속성은 정수, 문자열, 날짜 같은 특정 정의영역에서 값을 가져오며, 각 사원의 정보는 하나의 튜플에 해당한다.
다른 예로 '수강' 관계를 생각해 볼 수 있다. 이 관계는 학번, 과목코드, 성적이라는 세 개의 속성을 가질 수 있으며, 이는 차수가 3인 삼항 관계에 해당한다. 여기서 학번과 과목코드의 조합은 각 학생의 특정 과목 수강 이력을 유일하게 식별하는 후보 키 역할을 할 수 있다. 관계의 본체는 현재 데이터베이스에 존재하는 모든 수강 기록 튜플의 집합이 된다.
이러한 관계 예시들은 SQL을 사용해 실제 데이터베이스에서 기본 테이블로 구현된다. '사원' 관계는 CREATE TABLE Employee(...) 구문으로, '수강' 관계는 CREATE TABLE Enrollment(...) 구문으로 기본 관계변수를 정의하여 생성할 수 있다. 시간이 지남에 따라 새로운 사원이 입사하거나 학생이 과목을 수강하면, 해당 관계의 농도는 증가하며 관계값이 변경된다.
